---
title: Поворот матрицы на 90 градусов
description: Рассмотрим алгоритм поворота матрицы на 90 градусов по часовой стрелке и против часовой стрелки. Этот алгоритм похож на транспонирование матрицы с тем...
sections: [Транспонирование,Сравнение алгоритмов]
tags: [java,массивы,многомерные массивы,матрицы,строки,колонки,циклы,вложенные циклы]
canonical_url: /ru/2021/12/12/matrix-rotation-90-degrees.html
url_translated: /en/2021/12/13/matrix-rotation-90-degrees.html
title_translated: Matrix rotation 90 degrees
date: 2021.12.12
---

Рассмотрим алгоритм поворота матрицы на 90 градусов по часовой стрелке и против часовой стрелки.
Этот алгоритм похож на *транспонирование матрицы* с тем отличием, что здесь для каждой точки
одна из координат отображается зеркально.

```java
// транспонирование матрицы — строки и колонки меняются местами
swapped[j][i] = matrix[i][j];
// по часовой стрелке ↻ — строки отображаются зеркально
rotated[j][i] = matrix[m-i-1][j];
// против часовой стрелки ↺ — колонки отображаются зеркально
rotated[j][i] = matrix[i][n-j-1];
```

*Похожий алгоритм: [Поворот матрицы на 180 градусов]({{ '/ru/2021/12/16/matrix-rotation-180-degrees.html' | relative_url }}).*

Напишем метод на Java для поворота матрицы {`m×n`} на 90 градусов. Дополнительный параметр задаёт
направление поворота: по часовой стрелке или против часовой стрелки. Для примера возьмём
прямоугольную матрицу {`4×3`}.

```java
/**
 * @param m      количество строк исходной матрицы
 * @param n      количество колонок исходной матрицы
 * @param clock  направление поворота: по часовой
 *               стрелке ↻ или против часовой стрелки ↺
 * @param matrix исходная матрица
 * @return повёрнутая матрица
 */
public static int[][] rotateMatrix(int m, int n, boolean clock, int[][] matrix) {
    // новая матрица, количества строк и колонок меняются местами
    int[][] rotated = new int[n][m];
    // обходим строки исходной матрицы
    for (int i = 0; i < m; i++)
        // обходим колонки исходной матрицы
        for (int j = 0; j < n; j++)
            if (clock) // поворот по часовой стрелке ↻
                rotated[j][i] = matrix[m-i-1][j];
            else // поворот против часовой стрелки ↺
                rotated[j][i] = matrix[i][n-j-1];
    return rotated;
}
```
{% raw %}
```java
// запускаем программу и выводим результат
public static void main(String[] args) {
    // исходные данные
    int m = 4, n = 3;
    int[][] matrix = {{11, 12, 13}, {14, 15, 16}, {17, 18, 19}, {20, 21, 22}};
    // поворачиваем матрицу и выводим результат
    outputMatrix("Исходная матрица:", matrix);
    outputMatrix("По часовой стрелке ↻:", rotateMatrix(m, n, true, matrix));
    outputMatrix("Против часовой стрелки ↺:", rotateMatrix(m, n, false, matrix));
}
```
{% endraw %}
```java
// вспомогательный метод, выводит матрицу в консоль построчно
public static void outputMatrix(String title, int[][] matrix) {
    System.out.println(title);
    for (int[] row : matrix) {
        for (int el : row)
            System.out.print(" " + el);
        System.out.println();
    }
}
```

Вывод:

```
Исходная матрица:
 11 12 13
 14 15 16
 17 18 19
 20 21 22
По часовой стрелке ↻:
 20 17 14 11
 21 18 15 12
 22 19 16 13
Против часовой стрелки ↺:
 13 16 19 22
 12 15 18 21
 11 14 17 20
```
